package tcp;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 2.服务端
 * 创建ServerSocket(需要指定端口号)
 * 调用ServerSocket的accept()方法接收一个客户端请求，得到一个Socket
 * 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
 * 输入流可以读取客户端输出流写出的数据
 * 输出流可以写出数据到客户端的输入流
 * @throws IOException
 */
public class TCPServer {
    public static void main(String[] args) throws IOException {
        //1.创建服务器ServerSocket对象和系统要指定的端口号
        ServerSocket server = new ServerSocket(8888);
        //2.使用ServerSocket对象中的方法accept,获取到请求的客户端对象Socket
        Socket socket = server.accept();
        //3.使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
        InputStream is = socket.getInputStream();
        //4.使用网络字节输入流InputStream对象中的方法read,读取客户端发送的数据
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println(new String(bytes,0,len));
        //5.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
        OutputStream os = socket.getOutputStream();
        //6.使用网络字节输出流OutputStream对象中的方法write,给客户端回写数据
        os.write("收到谢谢".getBytes());
        //7.释放资源(Socket,ServerSocket)
        socket.close();
        server.close();   //服务器的一般不会关


//        demo1();   //使用包装类的
//        demo2();
    }


    /**
     * 使用包装类的写法
     */
    public static void demo1() throws IOException {
        ServerSocket server = new ServerSocket(8888);
        Socket socket = server.accept();						//接收客户端的请求
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));		//将字节流包装成了字符流
        PrintStream ps = new PrintStream(socket.getOutputStream());					//PrintStream中有写出换行的方法

        ps.println("欢迎咨询黑马程序员");
        System.out.println(br.readLine());
        ps.println("不好意思,爆满了");
        System.out.println(br.readLine());
        socket.close();
    }

    private static void demo2() throws IOException {
        ServerSocket server = new ServerSocket(12345);
        while(true) {
            final Socket socket = server.accept();						//接受客户端的请求
            new Thread(() -> {
                try {
                    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));		//将字节流包装成了字符流
                    PrintStream ps = new PrintStream(socket.getOutputStream());					//PrintStream中有写出换行的方法
                    ps.println("欢迎咨询黑马程序员");  //写出去
                    System.out.println(br.readLine());   //读取客户端内容
                    ps.println("不好意思,爆满了");  //写出去
                    System.out.println(br.readLine());  //读取客户端内容
                    socket.close();
                } catch (IOException e) {

                    e.printStackTrace();
                }
            }).start();
        }
    }
}
